Repository navigation
Prod: harden program project access and expert filters - #732
Merged
Merged
Conversation
TThanos3000
marked this pull request as ready for review
September 9, 2026 11:36
This was referenced Sep 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Основа и границы
295d85f34b62390aa347fa63b7f23da8b057d2f9, подтверждён послеgit fetch origin; совпадает с SHA аудита.8e3cd2d89f1e42a6457f3e924b75d7cf8bba5e76.Причины и исправления
ProjectVisibilityPermissionразрешал manager/expert связанной программы, но следующийHasInvolvementInProjectOrReadOnlyснова запрещал READ без project-level involvement. Добавлена отдельная ветка только для SAFE_METHODS и общий read helper.ProjectDetailSerializer.get_partner_program()использовал.get()при возможных нескольких PartnerProgramProject. Теперь выбор детерминированный.Точная READ / WRITE policy
partner_program: null.projects/views.py, в том числе production PATCH -> PATCH, не изменён.Expert filter schema
Только существующий
GET /programs/<id>/filters/использует новый узкий permission:Response/filtering semantics не меняются. Endpoint остаётся GET-only: mutation methods для допущенных пользователей возвращают 405. Другие manager endpoints, включая manager-overview, projects/filter и export, экспертам не открыты.
Missing program сохраняет production statuses: staff/superuser 404, остальные authenticated 403, anonymous 401.
Public data exposure: существующий контракт
На base опубликованный public Project с одной program link уже отдаёт
program_fieldsиprogram_field_valuesanonymous/outsider через singular serializer. Это не исправлено молча: сохранено и зафиксировано regression-тестом. Данная защита не делает уже публичные ответы приватными; отдельное изменение public contract требует согласования.Главная закрытая regression: private/draft multi-program Project не раскрывает поля чужой программы читателю, получившему доступ только по program role.
Проверки и SQL
Добавлены 20 regression-тестов (часть с subTest-матрицами):
На локальном PostgreSQL 18.1 / Python 3.11.15, с
procollab.settings_ciи изолированной тестовой БД:Локальное ограничение cleanup: после
Ran 1261 tests ... OKDjango получил OperationalError при DROP изолированнойtest_procollab_read_2606b0d1: на тот момент 21 оставшееся соединение. После завершения процесса соединений осталось 0; удалена только эта тестовая БД, без принудительного завершения чужих sessions. Test infrastructure не изменялась. Локальный exit 1 не скрыт; считать весь локальный command полностью зелёным нельзя. На PostgreSQL CI полный command, включая cleanup, завершился успешно.После прогрева View/ContentType/cache полный detail request:
Нет SQL-запросов в цикле по links; сериализуется одна выбранная связь. Часть diff существующих файлов является только нормализацией Black, без изменения соседней логики.
GitHub PostgreSQL CI: успешный run на exact head, PostgreSQL 15 / Python 3.11: 86 locking/constraint tests и полный suite 1261/1261. Выполнены checks, применение существующих migrations и очистка тестовой БД. Workflow запускался только на feature-ветке, не на master.
Дополнительный push CI: на последней проверке перед созданием PR Lint прошёл, Tests ещё выполнялся. Это отдельно от уже успешного PostgreSQL CI на том же head.
Production compatibility
Application / Team / Submission / SubmissionExpertAssignment / Evaluation и их endpoints/permissions/migrations не изменены.
/programs/<id>/manager-overview/не меняется. Не добавлены analytics, case/canonical fields API, current_project_application, evaluation deadline, новые endpoint/query params или массив partner_programs.Production vacancy/news/application/evaluation изменения сохранены; полный regression проверяет их вместе с port.
Draft для review. Не merge. Не deploy.